package com.atguigu.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.base.BaseDao;
import com.atguigu.base.BaseServiceImpl;
import com.atguigu.dao.PermissionDao;
import com.atguigu.dao.RolePermissionDao;
import com.atguigu.entity.Permission;
import com.atguigu.entity.RolePermission;
import com.atguigu.helper.PermissionHelper;
import com.atguigu.service.PermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = PermissionService.class)
@Transactional
public class PermissionServiceImpl extends BaseServiceImpl<Permission> implements PermissionService {
    @Autowired
    private PermissionDao permissionDao;
    @Autowired
    private RolePermissionDao rolePermissionDao;
    @Override
    protected BaseDao<Permission> getEntityDao() {
        return permissionDao;
    }

    /**
     * 查找到权限列表,展示给前端ztree树
     * @param roleId
     * @return
     */
    @Override
    public List<Map<String, Object>> findPermissionsByRoleId(Long roleId) {
        //1找查所有权限
        List<Permission> permissionList = permissionDao.findAll();
        //2根据角色ID查找该角色拥有的权限ID列表
        List<Long> rolePermissionList = rolePermissionDao.findPermissionByRoleId(roleId);
        //3进行前端需要的数据封装
        // 前端需要的格式:{ id:2, pId:0, name:"随意勾选 2", checked:true, open:true}, 这是其中一个元素
        //3.1遍历所有权限列表,一一对比封装数据
        //严谨点还是做个非空判断吧
        if(permissionList==null){
            return null;
        }
        List<Map<String, Object>> zNodes=new ArrayList<>();
        for (Permission permission : permissionList) {
            Map<String,Object> zNode =new HashMap<>();
            zNode.put("id",permission.getId());
            zNode.put("pId",permission.getParentId());
            zNode.put("name",permission.getName());
            if(rolePermissionList.contains(permission.getId())){
                zNode.put("checked",true);//这一项是判断是否需要✔,也就是判断该角色是否已经拥有该权限
            }else{
                zNode.put("checked",false);//这一项是判断是否需要✔,也就是判断该角色是否已经拥有该权限
            }
            //zNode.put("open",);   这一项是是否展开下拉框,交给前端去决定
            //将子元素添加到列表里
            zNodes.add(zNode);
        }
        return zNodes;
    }

    @Override
    public void saveRolePermissionRealtionShip(Long roleId, Long[] permissionIds) {
        //1根据角色ID删除之前所有权限
        rolePermissionDao.deleteByRoleId(roleId);
        //2根据传入的权限ID数组,把新的选中权限给角色添加上
        //2.1排除权限数组为空情况
        if(permissionIds==null){
            return;
        }
        //2.2遍历权限ID数组,一个个给角色添加上
        for (Long permissionId : permissionIds) {
            RolePermission rolePermission = new RolePermission();
            rolePermission.setPermissionId(permissionId);
            rolePermission.setRoleId(roleId);
            rolePermissionDao.insert(rolePermission);
        }
    }

    @Override
    public List<Permission> findMenuPermissionByAdminId(Long adminId) {
        //获取当前用户的菜单权限,这里定义一个1号用户为超级管理员,获得所有权限
        List<Permission> permissionList=null;//(不带下级)
        if(adminId==1){
            //此处分支是超级管理员
            permissionList = permissionDao.findAllMenuPermission();
        }else {
            //此处为其他用户
            permissionList = permissionDao.findListByAdminId(adminId);
        }
        //把权限数据构建成树形结构数据
        //为了方便前端给菜单分级,我们引入工具类对permissionList里的对象进行处理(处理permission对象的children属性关系)
        List<Permission> resultList = PermissionHelper.bulid(permissionList);//带下级的结果
        return resultList;
    }

    @Override
    public List<Permission> findAllMenu() {
        //查询到所有permission菜单权限
        List<Permission> permissionList=permissionDao.findAll();
        if(permissionList==null){
            return null;
        }
        //通过封装好的工具类封装成树形结构的集合
        List<Permission> result = PermissionHelper.bulid(permissionList);
        //返回数据
        return result;
    }

    @Override
    public List<String> findCodeListByAdminId(Long adminId) {
        //获取当前用户的功能按钮权限,这里定义一个1号用户为超级管理员,获得所有权限
        List<String> codeList=null;//(不带下级)
        if(adminId==1){
            //此处分支是超级管理员
            codeList = permissionDao.findAllCodeList();
        }else {
            //此处为其他用户
            codeList = permissionDao.findCodeListByAdminId(adminId);
        }
        //功能权限只需要传入权限的code给security处理就行
        return codeList;
    }
}
